require '../enums.rb'

class Charla < ActiveRecord::Base
  validates :titulo, :presence => {:message => '* Por favor ingrese el titulo de la charla'}
  validates :abstract, :length => { :maximum => 500, :message=>'* Por favor verifique que el campo descripción no supere el limite establecido de 500 caracteres.'}
  
  belongs_to :conferencia
  belongs_to :usuario
  belongs_to :moderador, class_name: 'Usuario'
  has_many :asignaciones 
  has_many :evaluadores, :through => :asignaciones
    
  validate :horario_inicio_mayor_horario_fin

  def horario_inicio_mayor_horario_fin
    if (self.horarioInicio <=> self.horarioFin) ==1
      errors.add(:fechaInicio, "* Por favor verifique que el horario de inicio sea anterior al horario de fin") 
    end
  end 

  def estadoCharlaEsNuevo?
    return self.estado == EstadoCharla::PROPUESTA
  end
  
  def estadoCharlaEnEvaluacion?
    return self.estado == EstadoCharla::ENEVALUACION
  end
  
  def estadoEvaluada?
    return self.estado == EstadoCharla::EVALUADA
  end
  
  def estadoAceptada?
    return self.estado == EstadoCharla::ACEPTADA
  end
  
  def tieneEvaluaciones?
     return Evaluacion.charlaTieneEvaluaciones?(self.id)
  end
  
  def sePuedeEvaluarCharla? (idUsuario)
    sePuedeEvaluarPorEstado = self.estadoCharlaEsNuevo? || self.estadoCharlaEnEvaluacion? 
    # se puede evaluar si yo no lo evalue. y si soy usuario reviewer de esa charla
    esUsuarioReviewer = Asignacion.usuarioPuedeEvaluarCharla?(self.id, idUsuario)
    usuarioYaEvaluo = Evaluacion.evaluacionYaRealizada?(self.id, idUsuario)
    
    return sePuedeEvaluarPorEstado && esUsuarioReviewer && !usuarioYaEvaluo
  end
  
  def datosBasicosUsuario(user)
    nombreApellido = user.nombre + " " + user.apellido 
    
    if ! user.titulo.empty? 
      titulo = (", " + user.titulo)
    else 
      titulo = ""
    end 
    
    if ! user.nombreEmpresa.empty?
      empresa = (", " + user.nombreEmpresa) 
    else
      empresa = " "
    end
    
    return nombreApellido + titulo + empresa 
  end
  
  def self.convertirHourStringToMinutes(hoursString)
    splitted_string = hoursString.split
    splitted_hour = splitted_string[0]
    hours = splitted_hour[0,2].to_i
    minutes = hoursString[3,2].to_i
    
    if (splitted_string[1] == "PM" )
      hours += 12
    end
    return hours * 60 + minutes
  end
    
  def self.convertirMinutesToHourString(minutes)
    minString = (minutes % 60) < 10 ? "0" + (minutes % 60).to_s : (minutes % 60).to_s 
    (minutes / 60).to_s + ":" + minString
  end
  
  def self.charlasAceptadasPendientesPlanificacion(idConferencia)
    Charla.where("conferencia_id = ? and horarioInicio is null and estado = ?", idConferencia, EstadoCharla::ACEPTADA)
  end
  
  def self.charlasAceptadasPlanificadas(idConferencia, fecha)
    Charla.where("conferencia_id = ? and horarioInicio is not null and estado = ? and fechaElegida =?", idConferencia, EstadoCharla::ACEPTADA, fecha)
  end
  
  def self.charlasAceptadasPlanificadasSinFecha(idConferencia)
    Charla.where("conferencia_id = ? and estado = ?", idConferencia, EstadoCharla::ACEPTADA)
  end 
  
  def self.filtrarCharlasPorEstado(idConferencia, estado)
    return Charla.where("conferencia_id = ? and estado = ?", idConferencia, estado)
  end
  
  def self.charlasSinUsuariosModeradores(idConferencia)
    return Charla.where("conferencia_id = ? and moderador_id is null and estado = ?", idConferencia, EstadoCharla::ACEPTADA)
  end
  
  def self.ordenarCharlas(idConferencia)
    listaOrdenada = filtrarCharlasPorEstado(idConferencia, EstadoCharla::PROPUESTA)
    
    listaOrdenada.concat(filtrarCharlasPorEstado(idConferencia, EstadoCharla::ENEVALUACION))
    listaOrdenada.concat(filtrarCharlasPorEstado(idConferencia, EstadoCharla::EVALUADA))
    listaOrdenada.concat(filtrarCharlasPorEstado(idConferencia, EstadoCharla::ACEPTADA))
    listaOrdenada.concat(filtrarCharlasPorEstado(idConferencia, EstadoCharla::RECHAZADA))
    listaOrdenada.concat(filtrarCharlasPorEstado(idConferencia, EstadoCharla::DESCARTADA))
    
    return listaOrdenada
  end
end
